// /import core
// /commands 引用
/**
 * 
 * 引用模块实现
 * 
 * @function
 * @name baidu.editor.execCommand
 * @param {String}
 *            cmdName blockquote引用
 */
(function() {

	var domUtils = baidu.editor.dom.domUtils, dtd = baidu.editor.dom.dtd, getObj = function(
			editor) {
		var startNode = editor.selection.getStart();
		return domUtils.findParentByTagName(startNode, 'blockquote', true)
	};

	baidu.editor.commands['blockquote'] = {
		execCommand : function(cmdName, attrs) {

			var range = this.selection.getRange(), obj = getObj(this), blockquote = dtd.blockquote, bookmark = range
					.createBookmark(), tds = this.currentSelectedArr;

			if (obj) {
				if (tds && tds.length) {
					domUtils.remove(obj, true)
				} else {
					var start = range.startContainer, startBlock = domUtils
							.isBlockElm(start) ? start : domUtils.findParent(
							start, function(node) {
								return domUtils.isBlockElm(node)
							}),

					end = range.endContainer, endBlock = domUtils
							.isBlockElm(end) ? end : domUtils.findParent(end,
							function(node) {
								return domUtils.isBlockElm(node)
							});

					// 处理一下li
					startBlock = domUtils.findParentByTagName(startBlock, 'li',
							true)
							|| startBlock;
					endBlock = domUtils.findParentByTagName(endBlock, 'li',
							true)
							|| endBlock;

					if (startBlock.tagName == 'LI'
							|| startBlock.tagName == 'TD' || startBlock === obj) {
						domUtils.remove(obj, true)
					} else {
						domUtils.breakParent(startBlock, obj);
					}

					if (startBlock !== endBlock) {
						obj = domUtils.findParentByTagName(endBlock,
								'blockquote');
						if (obj) {
							if (endBlock.tagName == 'LI'
									|| endBlock.tagName == 'TD') {
								domUtils.remove(obj, true)
							} else {
								domUtils.breakParent(endBlock, obj);
							}

						}
					}

					var blockquotes = domUtils.getElementsByTagName(
							this.document, 'blockquote');
					for (var i = 0, bi; bi = blockquotes[i++];) {
						if (!bi.childNodes.length) {
							domUtils.remove(bi)
						} else if (domUtils.getPosition(bi, startBlock)
								& domUtils.POSITION_FOLLOWING
								&& domUtils.getPosition(bi, endBlock)
								& domUtils.POSITION_PRECEDING) {
							domUtils.remove(bi, true)
						}
					}
				}

			} else {

				var tmpRange = range.cloneRange(), node = tmpRange.startContainer.nodeType == 1
						? tmpRange.startContainer
						: tmpRange.startContainer.parentNode, preNode = node, doEnd = 1;

				// 调整开始
				while (1) {
					if (domUtils.isBody(node)) {
						if (preNode !== node) {
							if (range.collapsed) {
								tmpRange.selectNode(preNode);
								doEnd = 0;
							} else {
								tmpRange.setStartBefore(preNode);
							}
						} else {
							tmpRange.setStart(node, 0)
						}

						break;
					}
					if (!blockquote[node.tagName]) {
						if (range.collapsed) {
							tmpRange.selectNode(preNode)
						} else
							tmpRange.setStartBefore(preNode);
						break;
					}

					preNode = node;
					node = node.parentNode;
				}

				// 调整结束
				if (doEnd) {
					preNode = node = node = tmpRange.endContainer.nodeType == 1
							? tmpRange.endContainer
							: tmpRange.endContainer.parentNode;
					while (1) {

						if (domUtils.isBody(node)) {
							if (preNode !== node) {

								tmpRange.setEndAfter(preNode);

							} else {
								tmpRange.setEnd(node, node.childNodes.length)
							}

							break;
						}
						if (!blockquote[node.tagName]) {
							tmpRange.setEndAfter(preNode);
							break;
						}

						preNode = node;
						node = node.parentNode;
					}

				}

				node = range.document.createElement('blockquote');
				domUtils.setAttributes(node, attrs);
				node.appendChild(tmpRange.extractContents());
				tmpRange.insertNode(node);
				// 去除重复的
				var childs = domUtils.getElementsByTagName(node, 'blockquote');
				for (var i = 0, ci; ci = childs[i++];) {
					if (ci.parentNode) {
						domUtils.remove(ci, true)
					}
				}

			}
			range.moveToBookmark(bookmark).select()
		},
		queryCommandState : function() {
			if (this.highlight) {
				return -1;
			}
			return getObj(this) ? 1 : 0;
		}
	};
	// baidu.editor.contextMenuItems.push({
	// label : '引用',
	// cmdName : 'blockquote'
	// })

})();
